/*
 * @Author: Wangjun
 * @Date: 2023-08-03 09:51:03
 * @LastEditTime: 2023-08-25 16:34:01
 * @LastEditors: Wangjun
 * @Description:
 * @FilePath: \nodex\nodelogic\op_sr.go
 * hnxr
 */
package nodelogic

import (
	"gitee.com/hnxr_1/nodex"
)

func init() {
	nodex.Reister(new(SR))
}

// SR 保持触发器
// 当置位信号和复位信号同时存在时，输出M状态。
type SR struct {
	nodex.Node
	S     nodex.Boolean `remark:"置位"`    //置位
	R     nodex.Boolean `remark:"复位"`    //复位
	M     nodex.Boolean `remark:"模式选择"`  //模式选择
	YLast nodex.Boolean `remark:"YLast"` //上一次的值

	Y nodex.Boolean `remark:"输出Y,,out"`
}

func (m *SR) GetModelID() int {
	return nodex.ModLogic
}

/**
 * @description:
 * @return {*}
 */
func (m *SR) GetName() string {
	return "SR"
}

func (m *SR) RegData() []byte {
	return nodex.MakeRegData(m, "保持触发器", m.GetName(), "")
}

/*
*
  - @description:保持触发器
  - @param {*} s //置位
  - @param {*} r //复位
  - @param {bool} m //模式选择
  - @return {*}//置位输出

S   R   YS
0   0   YLast
0   1   0
1   0   1
1   1   M
*/
func (m *SR) Calc() (err error) {
	if m.EnQ {
		if *m.S.Bad || *m.R.Bad || *m.M.Bad {
			m.Bad = true
			return //不计算
		}
	}

	if m.S.Value {
		if m.R.Value {
			m.Y.Value = m.M.Value
			m.YLast.Value = m.Y.Value
			return
		}
		m.Y.Value = true
		m.YLast.Value = m.Y.Value
		return
	}
	if m.R.Value {
		m.Y.Value = false
		m.YLast.Value = m.Y.Value
		return
	}
	m.Y.Value = m.YLast.Value
	m.Bad = false
	return
}
